package data;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;

import model.Consorcio;
import model.Departamento;
import model.DetalleDeuda;
import model.ItemsDetalleDeuda;

public class AdmPersistDetalleDeuda {
	
	private static AdmPersistDetalleDeuda instancia;
	
	private AdmPersistDetalleDeuda(){
		
	}
	
	public static AdmPersistDetalleDeuda getInstancia(){
		if (instancia == null)
			instancia = new AdmPersistDetalleDeuda();
		return instancia;
	}
	
	public void insert(Object o, Consorcio consorcio){
		try {
			DetalleDeuda dd = (DetalleDeuda)o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("insert into seminario.dbo.DetallesDeuda values (?,?,?,?,?)");
			//agregar campos
			s.setInt(1,dd.getNumero());			
			s.setInt(2,dd.getDepartamento().getUnidadFuncional());
			s.setInt(3,consorcio.getNumero());
			s.setString(4,String.valueOf((dd.getFecha().get(Calendar.YEAR))+"-"+(dd.getFecha().get(Calendar.MONTH)+1)+"-"+dd.getFecha().get(Calendar.DATE)));
			s.setBigDecimal(5,dd.getInteres());
			
			s.execute();
			
			//agregamos los items si es que se ejecuto el calcularTotal			
			if(!dd.getItems().isEmpty()){
				Vector <ItemsDetalleDeuda> items = dd.getItems();
				
				for(int i=0;i<items.size();i++){
					ItemsDetalleDeuda item = items.elementAt(i);
					
					s = con.prepareStatement("insert into seminario.dbo.ItemsDetalleDeuda values (?,?,?,?,?)");
					//agregar campos
					
					s.setInt(1,dd.getNumero());
					s.setInt(2,this.getMaxNroItem(dd.getNumero())+1);
					s.setString(3,String.valueOf((item.getPeriodo().get(Calendar.YEAR))+"-"+(item.getPeriodo().get(Calendar.MONTH)+1)+"-"+item.getPeriodo().get(Calendar.DATE)));
					s.setString(4,item.getConcepto());
					s.setFloat(5,item.getMonto());
					
					s.execute();
				}
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		} catch (Exception e) {
			System.out.println("problema");
			System.out.println(e.toString());
		}
	}
	
	public void update(Object o){
		
	}	
	
	public int getMaxNroDetalleDeuda(){
		try{
			int numero = 1;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select max(numero) as numero from seminario.dbo.DetallesDeuda");
			ResultSet result = s.executeQuery();
			while(result.next()){
				numero = result.getInt(1);
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return numero;			
		}
		catch (Exception e)
		{
			System.out.println();
		}
		return 0;
	}
	
	private int getMaxNroItem(int nroDetalleDeuda){
		try{
			int numero = 1;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select max(nroItem) as numero from seminario.dbo.ItemsDetalleDeuda " +
														"where nroDetalleDeuda = ?");
			s.setInt(1,nroDetalleDeuda);
			ResultSet result = s.executeQuery();
			while(result.next()){
				numero = result.getInt(1);
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return numero;
		}
		catch (Exception e)
		{
			System.out.println();
		}
		return 0;
	}
	
	public DetalleDeuda buscarDetalleDeuda(Calendar fecha, int nroConsorcio, int unidadFuncional){
		try{
			DetalleDeuda dt = null;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select numero,fecha,interes from seminario.dbo.DetallesDeuda where unidadFuncional = ? and nroConsorcio = ? and fecha like ?");
			s.setInt(1, unidadFuncional);
			s.setInt(2, nroConsorcio);
			String f = String.valueOf((fecha.get(Calendar.YEAR)))+"-"+String.valueOf((fecha.get(Calendar.MONTH)+1))+"-"+String.valueOf((fecha.get(Calendar.DAY_OF_MONTH)));
			//System.out.println(f);
			s.setString(3, f);
			ResultSet result = s.executeQuery();
			
			while(result.next()){
				
				int numero = result.getInt(1);
				Calendar fech = new GregorianCalendar();
				fech.setTime(result.getDate(2));
				BigDecimal inter = result.getBigDecimal(3);
				Departamento depto = AdmPersistDepartamento.getInstancia().buscarDepartamento(unidadFuncional, nroConsorcio);
				dt = new DetalleDeuda(numero, fech, inter, depto);
				
				PreparedStatement s1 = con.prepareStatement("select periodo, concepto, monto from seminario.dbo.ItemsDetalleDeuda where nroDetalleDeuda = ? order by periodo");	
				s1.setInt(1, numero);
				ResultSet result2 = s1.executeQuery();
					while(result2.next()){
						Calendar periodo = new GregorianCalendar();
						periodo.setTime(result2.getDate(1));
						String concepto = result2.getString(2);
						Float monto = result2.getFloat(3);
						
						dt.agregarItem(periodo, concepto, monto);						
					}
									
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return dt;												
			
		}
		catch (Exception e)
		{
			System.out.println("Error al buscar Detalle de Deuda");
			System.out.println("Stack Trace al leer la Base de datos: " + e.getStackTrace());
		}
		return null;
	}
	
	
	public DetalleDeuda buscarDetalleDeuda(int numero){
		try{
			DetalleDeuda dt = null;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con.prepareStatement("select numero,fecha,interes,unidadFuncional,nroConsorcio from seminario.dbo.DetallesDeuda where numero = ?");
			s.setInt(1, numero);			
			ResultSet result = s.executeQuery();
			
			while(result.next()){
				
				int num = result.getInt(1);
				Calendar fech = new GregorianCalendar();
				fech.setTime(result.getDate(2));
				BigDecimal inter = result.getBigDecimal(3);
				int unidadFuncional = result.getInt(4);
				int nroConsorcio = result.getInt(5);
				
				Departamento depto = AdmPersistDepartamento.getInstancia().buscarDepartamento(unidadFuncional, nroConsorcio);
				dt = new DetalleDeuda(numero, fech, inter, depto);
				
				PreparedStatement s1 = con.prepareStatement("select periodo, concepto, monto from seminario.dbo.ItemsDetalleDeuda where nroDetalleDeuda = ? order by periodo");	
				s1.setInt(1, num);
				ResultSet result2 = s1.executeQuery();
					while(result2.next()){
						Calendar periodo = new GregorianCalendar();
						periodo.setTime(result2.getDate(1));
						String concepto = result2.getString(2);
						Float monto = result2.getFloat(3);
						
						dt.agregarItem(periodo, concepto, monto);						
					}
									
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return dt;												
			
		}
		catch (Exception e)
		{
			System.out.println("Error al buscar Detalle de Deuda");
			System.out.println("Stack Trace al leer la Base de datos: " + e.getStackTrace());
		}
		return null;
	}	
	
	
}
